package com.nuyoah.controller;

import cn.dev33.satoken.stp.StpUtil;
import com.nuyoah.common.dto.UserDto;
import com.nuyoah.common.lang.Result;
import com.nuyoah.entity.Teacher;
import com.nuyoah.entity.User;
import com.nuyoah.service.TeacherService;
import com.nuyoah.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import cn.hutool.crypto.digest.DigestUtil;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

/**
 * 教师信息相关接口
 *
 * @author xyx
 * @since 2024-06-03
 */
@RestController
@RequestMapping("/teacher")
public class TeacherController {

    @Autowired
    private UserService userService;

    @Autowired
    private TeacherService teacherService;


    /**
     * 更新教师信息接口。
     * 该方法通过接收一个包含更新信息的UserDto对象，来更新已存在教师的信息。
     * 首先，验证传入的教师信息是否存在，如果不存在，则返回错误信息。
     * 其次，对用户的密码进行加密处理，然后更新用户的各项信息。
     * 最后，更新教师的教学计划和教学经验，并返回更新成功的消息。
     *
     * @param teacher 包含待更新教师信息的UserDto对象。
     * @return 返回一个Result对象，其中包含更新操作的结果信息。
     */
    //更新教师信息接口
    @RequestMapping("/updateTeacherInfo")
    public Result updateTeacherInfo(@Validated @RequestBody UserDto teacher){
        //验证教师id是否存在
        if(teacherService.getByUserId(teacher.getId()) == null){
            return Result.fail("该ID不存在，更新失败");
        }
        // 创建User对象用于更新用户信息
        // 创建一个新的User对象，用于更新用户信息
        User u = new User();
        // 创建Teacher对象用于更新教师信息
        Teacher t = new Teacher();
        // 设置用户ID
        // 设置用户ID
        u.setId(teacher.getId());
        // 更新用户的用户名、加密后的密码、真实姓名、电子邮件和电话
        // 更新用户的用户名、密码、真实姓名、电子邮件和电话
        u.setUsername(teacher.getUsername());
        u.setPassword(DigestUtil.md5Hex(teacher.getPassword()));
        u.setRealName(teacher.getRealName());
        u.setEmail(teacher.getEmail());
        u.setPhone(teacher.getPhone());
        u.setAge(teacher.getAge());
        u.setGender(teacher.getGender());
        // 更新用户信息
        userService.updateById(u);
        // 设置教师ID
        // 更新教师的教学计划和教学经验
        t.setId(teacher.getId());
        // 更新教师的教学计划和教学经验
        t.setTeachingExperience(teacher.getTeachingExperience());
        // 更新教师信息
        teacherService.updateById(t);
        // 返回更新成功的消息
        // 返回更新成功的消息
        return Result.succ("更新成功");
    }




    /**
     *教师个人信息接口
     * @return Result 对象，包含查询成功的教师信息或错误消息。
     */
    //教师查询个人详细接口
    @RequestMapping("/getTeacherInfo")
    public Result getTeacherInfo(){
        try {
            Integer ids = StpUtil.getLoginIdAsInt();;
            //通过id到用户表中查询用户信息
            User user = userService.getUserById(ids);
            // 如果用户不存在，则返回错误信息
            if (user == null) {
                return Result.fail("用户不存在");
            }
            // 获取用户ID，用于进一步查询教师详细信息
            Integer id = user.getId();

            // 创建UserDto对象，用于包装教师的展示信息
            UserDto teacher = new UserDto();
            // 设置教师的用户名、真实姓名、邮箱和电话
            teacher.setUsername(user.getUsername());
            teacher.setRealName(user.getRealName());
            teacher.setEmail(user.getEmail());
            teacher.setPhone(user.getPhone());
            teacher.setAge(user.getAge());
            teacher.setGender(user.getGender());
            // 根据用户ID查询教师的教学信息
            Teacher t = teacherService.getByUserId(id);
            // 设置教师的教学计划和教学经验
            teacher.setTeachingExperience(t.getTeachingExperience());
            teacher.setId(id);
            // 返回查询成功的教师信息
            return Result.succ(teacher);
        } catch (Exception e) {
            // 捕获查询过程中可能出现的异常，并打印堆栈跟踪
            e.printStackTrace();
            // 返回查询失败的消息
            return Result.fail("获取教师信息失败");
        }
    }

    /**
     * 教师注册接口。
     * 通过接收一个教师的详细信息，包括用户名、密码、真实姓名、电子邮件和电话等，来创建一个新的教师用户和相关教师信息。
     * 在创建之前，会检查用户名是否已经存在，以避免重复注册。
     * 注册成功后，会为新教师用户分配角色，并保存到数据库中。
     *
     * @param teacher 教师的详细信息，包括用户名、密码、真实姓名、电子邮件、电话、教学计划和教学经验等。
     * @return 注册结果，如果成功，则返回注册成功的消息；如果失败，则返回失败的原因。
     */
    //教师注册接口
    @RequestMapping("/register")
    public Result register(@Validated @RequestBody UserDto teacher) {
        // 检查用户名是否已存在
        if (userService.getByUsername(teacher.getUsername()) != null) {
            return Result.fail("用户名已存在，请重新注册");
        }

        // 创建一个新的用户对象，并设置用户名、密码、真实姓名、电子邮件和电话等信息。
        User user = new User();
        user.setUsername(teacher.getUsername());
        user.setPassword(DigestUtil.md5Hex(teacher.getPassword()));
        user.setRealName(teacher.getRealName());
        user.setEmail(teacher.getEmail());
        user.setPhone(teacher.getPhone());
        // 保存用户信息到数据库
        userService.save(user);

        // 创建一个新的教师对象，并设置用户ID、教学计划和教学经验等信息。
        Teacher t = new Teacher();
        t.setId(user.getId());
        t.setTeachingExperience(teacher.getTeachingExperience());
        // 保存教师信息到数据库
        teacherService.save(t);

        // 为新注册的教师用户分配角色（例如，角色ID为3表示教师角色）
        userService.insertUserRoleBinding(user.getId(), 3);

        // 返回注册成功的结果
        return Result.succ("注册成功");
    }


}
